<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script> /*复习*/
    //函数声明、参数（形参、实参）（arguments）、返回值return
    //函数表达式、匿名函数、立即执行函数
    //回调函数、递归函数
    //函数可以作为其他函数的返回值进行返回（返回的函数要进行调用，如果不调用返回的将是一个函数声明的整个内容）
    function fn1(a,b){
        console.log('hn1函数调用');
        return a+b;
    }
    let fn2 = function(f){
        console.log('hn2函数调用');
        return f;
    }
    console.log(fn2(fn1(3,2)));
    console.log(fn1(1,2));

    //作用域：作用的范围
    /*
    //js的运行分两个部分：
    1.解析（编译）：语法检查、声明变量和函数
    2.执行：对变量进行赋值、按照执行顺序进行执行
    var和let的区别：
    1.var和let声明变量:var可以先使用再声明，let不允许。var有声明提升;let声明提升后执行时会出现暂时性死区，因此会报错。
    2.var在同一个作用域内声明的变量名可以相同，而let不允许。
    3.var和let都全局作用域和局部作用域（函数作用域）。
    推荐使用let（ES6），是我们的代码更严谨！
    */
  // console.log(num1);
   console.log(num2);
   let num1;
   var num2=10;
   console.log(num2);
   var num2 = 'hello';
   console.log(num2);

    console.log('--------');
    //全局作用域：全局变量
    let a = 1;var b= 2;
    function myf(){
        //局部作用域（函数作用域）：局部变量
    let c=3;
    var d = 4;
    console.log(a);
    console.log(b);
    console.log(c);
    console.log(d);
    }
    myf();
    console.log(a);
    console.log(b);

   // console.log(c);//报错
    //console.log(d);//报错
    console.log('-----------块作用域-----------')
    //在let中增加了一个块作用域{}
    for(let i=0;i<3;i++){
        console.log('i:'+i);
    }
//    console.log(i);//报错：离开了块作用域

    for(var j = 0;j < 3;j++){
        console.log('j:'+j);
    }
    console.log(j)
</script>
</html>